package chixing.day05;
public class MyContainer {
    private int[] array;
    private int size;

    /**
     * 构建一个新的空容器，默认是10个容量的数组
     */
    public MyContainer() {
        array = new int[10];
        size = 0;
    }

    /**
     * 构建一个新的空容器，容量是用户指定的初始容量
     * @param initCapacity 指定的初始容量
     */
    public MyContainer(int initCapacity) {
        array = new int[initCapacity];
        size = 0;
    }

    /**
     * 在容器尾部添加新元素
     * @param ele 新元素
     * @return 添加成功返回true
     */
    public boolean add(int ele) {
        // 检查是否需要扩容
        if (size >= array.length) {
            expandCapacity();
        }
        array[size++] = ele;
        return true;
    }

    /**
     * 在指定位置添加元素
     * @param ele 新元素
     * @param index 添加的指定位置
     * @return 添加成功返回true，索引无效返回false
     */
    public boolean add(int ele, int index) {
        // 检查索引是否合法
        if (index < 0 || index > size) {
            return false;
        }
        // 检查是否需要扩容
        if (size >= array.length) {
            expandCapacity();
        }
        // 将指定位置及后面的元素后移
        System.arraycopy(array, index, array, index + 1, size - index);
        array[index] = ele;
        size++;
        return true;
    }

    /**
     * 删除指定位置的元素
     * @param index 删除的指定位置
     * @return 删除成功返回true，索引无效返回false
     */
    public boolean remove(int index) {
        // 检查索引是否合法
        if (index < 0 || index >= size) {
            return false;
        }
        // 将指定位置后面的元素前移
        System.arraycopy(array, index + 1, array, index, size - index - 1);
        size--;
        return true;
    }

    /**
     * 获得容器中已有元素的个数
     * @return 元素个数
     */
    public int size() {
        return size;
    }

    /**
     * 打印输出容器中已有元素
     */
    public void print() {
        if (size == 0) {
            System.out.println("[]");
            return;
        }
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < size; i++) {
            sb.append(array[i]);
            if (i < size - 1) {
                sb.append(", ");
            }
        }
        sb.append("]");
        System.out.println(sb.toString());
    }

    /**
     * 扩容方法，扩容为原来的2n+1
     */
    private void expandCapacity() {
        int newCapacity = array.length << 2 + 1;
        int[] newArray = new int[newCapacity];
        System.arraycopy(array, 0, newArray, 0, size);
        array = newArray;
    }
}

